# -*- coding: UTF-8 -*-
"""
将缓存中的各种调度任务持久化
类型包括： 1. 延时时间过长的延时任务 2. 普通的即时任务（状态更新）
"""
import asyncio
import json

from common_libs.cache_utils import get_redis_connection
from common_libs.ctx_utils import app_context
from dispatcher import app
from dispatcher.common_utils.constants import ALLOW_DISPATCH_TASK_TYPES
from dispatcher.models.data_block import DataBlockModelManager


class DumpTask(object):

    @classmethod
    async def run(cls):
        # todo 这里是否应该写成一个lua脚本？这里对时效性要求不高，对性能要求也不高，而且数据量可能会比较大，且较为复杂
        conn = await get_redis_connection()
        task_keys = ALLOW_DISPATCH_TASK_TYPES
        data_blocks = []
        for fuzzy_task_key in task_keys:
            key = f"{fuzzy_task_key.get('dispatch_type')}:{fuzzy_task_key.get('task_type')}:"
            fields = await conn.yscan(key, 0, match=f"{key}*")

            data = [json.loads(await conn.get(field)) for field in fields]  # todo 这里是否应该改成lua脚本，速度会更快
            data_blocks.extend(data)

        await DataBlockModelManager.insert_data_block(data_blocks)


async def work():
    async with app_context(app):
        await DumpTask.run()  # todo 这里是类直接调度，开多个会不会有问题？


if __name__ == '__main__':
    # fixme 这里需要获取参数， 执行脚本， 使用pm2管理脚本，需要自己定义脚本执行规则
    loop = asyncio.get_event_loop()
    task = asyncio.ensure_future(work())
    loop.run_until_complete(task)
